import { reactive, ref, Ref, nextTick } from 'vue';
import { onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app';
/**
 * 数据加载 hooks
 * @param {Function} http 请求函数，返回一个 Promise 对象，resolve 值为请求结果对象，包含 data、code、msg 等字段。
 * @param {boolean} paging 是否开启分页
 * @param {boolean} pullDown 是否开启下拉刷新
 * @param {boolean} pullUp 是否开启上拉加载
 * @return
 */
export default function useDataLoad(http : Function, paging : boolean = true, pullDown : boolean = true, pullUp : boolean = true) {
	const dataList : any = ref([]);
	const pageParams = reactive({ pageNum: 1, pageSize: 10 }); // 分页参数，默认每页10条数据、
	const params : any = reactive({}); // 请求参数，默认为空对象
	const isMore = ref(true); // 是否有更多数据，用于上拉加载更多功能。
	const loading = ref(false); // 是否正在加载数据，用于防止重复加载数据。
	/**
	 * 设置请求参数，用于动态修改请求参数，例如搜索功能等。
	 */
	const setParams = (newParams : any) => {
		for (let i in newParams) {
			if (newParams[i]) {
				params[i] = newParams[i];
			} else {
				delete params[i];
			}
		}
		console.log(params);
	};
	/**
	 * 获取数据
	 */
	const getData = async () => {
		let paramsObj = { ...params };
		loading.value = true;
		// 处理分页
		if (paging) {
			paramsObj = Object.assign({}, pageParams, params);
		}
		// 处理分页参数，确保 page 参数正确传递。
		paramsObj.page = paramsObj.pageNum;

		delete paramsObj.pageNum;
		delete paramsObj.pageSize;
		// 执行请求
		const res = await http({
			...paramsObj,
		});
		let list = res.list || res;
		if (pageParams.pageSize > list.length) {
			isMore.value = false;
		} else {
			isMore.value = true;
		}
		if (pageParams.pageNum === 1) {
			dataList.value = []; // 如果是第一页，清空数据列表。
			// 确保数据列表清空后再添加新数据。
			dataList.value = list; // 添加新数据。
		} else {
			dataList.value = [...dataList.value, ...list];
		}
		loading.value = false;
	};
	const reGetData = async () => {
		// 重新获取数据，用于刷新数据、重新加载数据等场景。
		pageParams.pageNum = 1; // 重置分页参数，从第一页开始加载数据。
		await getData(); // 重新加载数据。
	};
	onPullDownRefresh(async () => {
		console.log('触发下拉刷新');
		if (pullDown) {
			pageParams.pageNum = 1;
			await getData(); // 重新加载数据
			uni.stopPullDownRefresh();
		}
	});
	onReachBottom(async () => {
		console.log('触发下拉加载');
		if (pullUp && isMore.value) {
			pageParams.pageNum += 1;
			uni.showLoading({
				title: '加载中'
			});
			await getData(); // 重新加载数据
			uni.hideLoading();
		}
	});
	return {
		dataList,
		getData,
		reGetData,
		setParams
	};
}